import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 此处约定请求中 给定的 query string 是形如: username=zhangsan&password=123
        // 上述 query string 就会被 tomcat 给自动解析成一个 Map 这样的结构
        // getParameter 就是在查询 Map<String, String> 里面的内容
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // 此时我们就可以拿到这两个内容, 做一些其他的处理

        // 比如打印
        System.out.println("username="+username);
        System.out.println("password="+password);

        // 然后返回给客户端
        resp.getWriter().write("ok");
        // 如果没有 query string 得到的结果就是 null

       // 这里面需要知道 如何和前端进行交互? 如何获取到前端传递来的参数?
        // 第一种方法就是 query string   用到 getParameter
        // 呢么问题就来了
        // 一个url 中的 query string , ket 和 value , 到底是谁负责定义? 到底要定义成什么?
        // 由相关的程序员统一讨论后的结果
        // 除了 query string 之外 还可以通过 http 请求的 body 来传递参数
        // (POST)
        // 接下来的两个是 第二种和第三种方法
        // 1) 直接通过form 表单
        // (body 的格式就是 query string 的格式)
        //  Content-Type: application/x-www-form-urlencoded    (这个方法也用到 getParameter 方法)
        // (那么如果 query string 和 body 中的都传递了键值对, 那么 req.getParameter() 方法 会先选取哪一个呢?
        // 因为 Servlet 没有承诺这种情况是哪一个优先,完全取决于内部代码是怎么写的, 也保不齐某个版本里面的代码一改,得到的结果就不一样了 )
        // 2) 直接通过json
        // (body 的格式就是 json)
        // Content-Type:application/json
        // 这三种方式本质上是等价的, 都是把键值对数据交给服务器
        // 只不过具体用哪种方式,更多的是看个人习惯,也是公司产品既定的代码风格
        // 但是前面的两种方式都是 servlet 自身支持的, 而 json 是 servlet 自身不支持的
        // 需要引入额外的第三方库
        // 对json格式的数据进行解析和构造, 就需要引入 json 的库
        // 在 java 中 json 的第三方库是非常多的
        // 此处使用 jackson
        // (jackson 是 spring 官方推荐的库, 也被 spring 集成起来了)
        // 1) 下载导入 jackson 到项目中, 通过maven即可
        // 进入 jackson databind 中 找到 2.15.0版本 ,然后复制坐标, 再粘贴到 pom.xml 中, 刷新
        // 2) 使用 jackson
        // 一个类 和 两个方法
        //  类: ObjectMapper
        //       对象  映射
        // (把 json 字符串 , 映射成一个 java 对象 (用到 read 方法), 也可以把 java对象, 映射成 json 字符串(用到 write方法))

    }
}
